package chapter3.homework;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @Project ：learn_java
 * @File ：Q8.java
 * @IDE ：IntelliJ IDEA
 * @Author ：自由如风间
 * @Date ：2025/3/4 19:20
 * @Description ：复制一个文件夹里面的全部内容到另一个文件夹
 */

public class Q8 {
    public static void main(String[] args) throws IOException {
        String srcPath = "E:\\BaiduNetdiskDownload\\何学长java\\03第三章 IO流技术\\资料";
        String destPath = "testIO\\复制的资料";

        File src = new File(srcPath);
        File dest = new File(destPath);

        boolean mkdir = dest.mkdir();

        // 创建存储的文件夹
        if (mkdir) {
            System.out.println("创建文件夹成功");
        }
        else {
            System.out.println("创建文件夹失败\n程序终止");
            return;
        }

        // 复制所有文件
        copyFile(src, dest);
    }

    /**
     * 复制所有文件夹
     * @param src 起点文件夹
     * @param dest 终点文件夹
     */
    public static void copyFile(File src, File dest) throws IOException {
        if (src.isDirectory()) {
            File[] files = src.listFiles();
            for (File file : files) {
                // 如果是文件夹则继续向内递归
                File destSubDir = new File(dest, file.getName());
                // 如果下面还有文件夹，则先创建文件夹
                if (file.isDirectory()) {
                    destSubDir.mkdirs();
                }
                copyFile(file, destSubDir);
            }
        }
        else {
            // 如果是文件则直接复制
            try (
                    FileInputStream fis = new FileInputStream(src);
                    FileOutputStream fos = new FileOutputStream(dest)
            ) {
                // 缓存复制效率更高
                byte[] buffer = new byte[1024];
                int length;
                while ((length = fis.read(buffer)) != -1) {
                    fos.write(buffer, 0, length);
                }
                System.out.println(src + "复制成功");
            } catch (Exception e) {
                System.out.println(src + "复制失败");
                e.printStackTrace();
            }
        }
    }
}
